#ifndef _MAIN_H
#define _MAIN_H


#include "gd32e230.h"
#include "systick.h"
#include <stdio.h>
#include <string.h>
#include "MyUart.h"
#include "MySystick.h"
#include "MyI2C.h"
#include "MyW24C02.h"
#include "MySPI.h"
#include "MyW25Q64.h"
#include "MyFmc.h"
#include "myboot.h"
									

//**********************************************
//bootloader分区块
//**********************************************
#define GD32_FLASH_START_ADDR 0x08000000																							//Flash起始地址
#define GD32_PAGE_SIZE 				1024																										//Flash扇区大小
#define GD32_PAGE_NUM 				64																											//Flash总扇区个数
#define GD32_B_PAGE_NUM				20																											//B扇区个数
#define GD32_A_PAGE_NUM				(GD32_PAGE_NUM-GD32_B_PAGE_NUM)													//A扇区个数
#define GD32_A_START_PAGE			GD32_B_PAGE_NUM																					//A分区起始扇区号
#define GD32_A_SADDR					GD32_FLASH_START_ADDR+GD32_A_START_PAGE*GD32_PAGE_SIZE	//FlashA分区区起始地址



//**********************************************
//OTA升级控制块
//**********************************************
#define OTA_NEED_UPDATA			0xaaaaaaaa							//有OTA事件时OTA_Flag的值
#define OTA_INFO_SIZE				sizeof(OTA_InfoCB)


//**********************************************
//状态机 标志定义块
//**********************************************
#define UPDATA_APPLICATION_FLAG    0x00000001				//更新APP标志位
#define IAP_XMODEM_SENDC_FLAG      0x00000002				//Xmodem发送‘C’标志位
#define IAP_XMODEM_REC_DATA_FLAG   0x00000004				//Xmodem接收数据标志位
#define	VERSION_SET_FLAG					 0x00000008				//设置版本号标志位
#define	VERSION_CHEAK_FLAG				 0x00000010				//查看版本号标志位
#define NEED_XBLOCK_FLAG	 				 0x00000020				//指定下载位置块号标志位
#define	LOAD_IN_EXTERN_FLASH_FLAG	 0x00000040				//向外部flash下载程序标志位
#define LOAD_APP_FROM_EXTERN_FLAG  0x00000080				//从外部flash下载程序标志位


//OTA信息结构体（需要存储在非易失介质中）
typedef struct
{
	uint32_t	OTA_Flag;									//OTA标准位 用于跳转分区判断
	uint32_t 	FireLen[11];							//程序长度记录数组 11是为了实现16字节对齐
	uint8_t 	Version[32];							//版本号字符串
}OTA_InfoCB;

//程序升级结构体
typedef struct
{
	//更新缓冲区
	uint8_t Updata_buffer[GD32_PAGE_SIZE];
	//用于选择更新（存在多个应用程序时）
	uint32_t W25Q64_xBlock;
	//Xmodem通讯延迟
	uint32_t XmodemTimer; 
	//Xmodem数据包已接收数量
	uint32_t Xmodem_xPacket; 
	//XmodemCRC值
	uint32_t XmodemCRC; 
}UpDataCB;


//需要保存的状态信息
extern OTA_InfoCB OTA_info;
extern UpDataCB		updataA;
//状态机标志位
extern uint32_t BootStatuesFlag;


#endif

